package com.xm.lock.sad;

import lombok.Getter;

import java.util.concurrent.locks.ReentrantLock;

/**
 * ReentrantLock √
 * 原理：
 *   ReentrantLock 是 java.util.concurrent.locks 包中的一个可重入锁实现。
 *   它比 synchronized 更灵活，支持公平锁、非公平锁以及条件变量。
 * 特点：
 *   支持公平锁和非公平锁。
 *   需要手动释放锁，避免死锁。
 *   适用于高并发场景。
 */
public class TestReentrantLock02 {
    @Getter
    private int count = 0;
    // 核心类AbstractQueuedSynchronizer，lock调的tryAcquire方法、unlock调的tryRelease方法，
    // 有两种锁，公平锁 竞争state状态；非公平锁 谁抢到state就是谁的，
    // 底层使用了 unsafe.compareAndSetInt 方法
    private final ReentrantLock lock = new ReentrantLock(true);

    public void increment() {
        lock.lock();// initialTryLock、tryAcquire、acquire
        try {
            count++;
        } finally {
            lock.unlock();// tryRelease
        }
    }

}
